DUA3:<000000>PASCAL035.RELEASE_NOTES;14

















                    VAX PASCAL V3.5 Release Notes

                    VAX PASCAL V3.5 Release Notes

                            12 March 1987

                            12 March 1987







     This document contains information about new features in VAX
     PASCAL V3.5, differences between V3.5 and previous versions,
     corrections included in VAX PASCAL V3.5, and  other  topics.
     This  file  is  of  interest  to  both system management and
     application programmers.








                                   CONTENTS



CHAPTER 1       VAX PASCAL V3.5 RELEASE NOTES

        1.1     NEW FEATURES IN VAX PASCAL V3.5  . . . . . . . . . 1-1
        1.1.1     VAX SCA Support  . . . . . . . . . . . . . . . . 1-1
        1.1.2     KEY Attribute Enhancements . . . . . . . . . . . 1-2
        1.2     COMPATIBILITY NOTES  . . . . . . . . . . . . . . . 1-3
        1.2.1     Redeclaration Of A Name In A Parameter List  . . 1-3
        1.2.2     File Location With Partial Filespecs On 
                  Qualifiers . . . . . . . . . . . . . . . . . . . 1-3
        1.2.3     Default Length And Digits Parameters For DEC And 
                  UDEC . . . . . . . . . . . . . . . . . . . . . . 1-4
        1.2.4     VAR READONLY Parameters  . . . . . . . . . . . . 1-5
        1.3     UPDATED VAX PASCAL REFERENCE MANUAL AND USER 
                MANUAL . . . . . . . . . . . . . . . . . . . . . . 1-6
        1.4     STARLET.PAS INSTALLATION DEPENDENCY  . . . . . . . 1-6
        1.5     KNOWN RESTRICTIONS . . . . . . . . . . . . . . . . 1-6
        1.5.1     Blank Padding Of PACKED ARRAY OF CHAR Value 
                  Parameters . . . . . . . . . . . . . . . . . . . 1-6
        1.5.2     String Expressions As Actual Value Parameters  . 1-7
        1.5.3     Passing File Buffer Variables  . . . . . . . . . 1-7
        1.6     NEW ERROR MESSAGES . . . . . . . . . . . . . . . . 1-8


CHAPTER 2       VAX PASCAL V3.5 MAINTENANCE FIXES




































                              CHAPTER 1

                              CHAPTER 1

                    VAX PASCAL V3.5 RELEASE NOTES

                    VAX PASCAL V3.5 RELEASE NOTES



1.1  NEW FEATURES IN VAX PASCAL V3.5

VAX PASCAL V3.5 has been enhanced with the following new features.



1.1.1  VAX SCA Support

VAX PASCAL V3.5 supports the VAX Source Code Analyzer.  The VAX Source
Code  Analyzer  is  a  multilanguage,  interactive cross-reference and
static analysis tool that provides detailed information  about  source
code.   The  VAX  Source  Code  Analyzer  works  together with the VAX
Language-Sensitive  Editor  to  create  an  integrated,  multilanguage
software development environment.

The VAX Source Code Analyzer helps you understand large-scale software
projects  by  allowing  you to make inquires about the symbols used in
such projects.  With SCA, you can quickly locate information about any
identifier.   Thus,  SCA is extremely useful during the implementation
and maintenance phases of a project.

The following command line qualifier has  been  added  to  VAX  PASCAL
V3.5.

        /ANALYSIS_DATA[=filename]

The /ANALYSIS_DATA qualifier creates a  file  containing  source  code
analysis  information.   If  you  omit  the  file  specification,  the
analysis file defaults to the name of your source  file  with  a  file
type of ANA.

The source code analysis file is reserved for use with DIGITAL layered
products such as, but not limited to, the VAX Source Code Analyzer.






                                 1-1





















                    VAX PASCAL V3.5 RELEASE NOTES

                    VAX PASCAL V3.5 RELEASE NOTES


1.1.2  KEY Attribute Enhancements

The KEY attribute has been extended to allow additional properties  to
be  specified  for ISAM keys.  The KEY attribute now has the following
forms:

    KEY [ (key_number) ]
    KEY [ (key_number [,options...]) ]
    KEY [ (options,...) ]

The parameter keynumber represents the ISAM key number.  A key  number
of  0  indicates  the  primary  key  and  all  other  numbers indicate
alternate keys.  If you omit the key number, the default value is 0.

The following options have been added:

      o  ASCENDING - Specifies an ascending collating sequence.

      o  DESCENDING - Specifies a descending collating sequence.

      o  [NO]CHANGES - Specifies that changes can be performed on  the
         key.

      o  [NO]DUPLICATES - Specifies that duplicates  of  the  key  are
         allowed.

By default, the primary key is ASCENDING, NOCHANGES, and  NODUPLICATES
and  alternate  keys  are  ASCENDING,  CHANGES, and DUPLICATES.  It is
illegal to specify CHANGES on the primary key.

These defaults are  the  same  as  previously  used  in  the  Run-Time
Library,  so  programs  compiled with an earlier version of VAX PASCAL
will continue to function as they have previously.

The CHANGES and DUPLICATES options are used only  when  creating  ISAM
files.   They  are  ignored for opening existing files.  The ASCENDING
and DESCENDING keywords are used to define the keys for file  creation
and are used to verify keys when opening an existing file.  If neither
ASCENDING or DESCENDING is specified when opening an existing file, no
check will be performed and either type will be accepted.

     This  new  feature  requires  PASRTL  (VAX  PASCAL  Run-Time

     This  new  feature  requires  PASRTL  (VAX  PASCAL  Run-Time
     Library)  support that won't be available until VAX/VMS V4.6

     Library)  support that won't be available until VAX/VMS V4.6
     or greater.  If  you  use  any  of  the  new  KEY  attribute

     or greater.  If  you  use  any  of  the  new  KEY  attribute
     options,  the  object  file produced will not run on systems

     options,  the  object  file produced will not run on systems
     earlier than VAX/VMS V4.6.  The  VAX  PASCAL  V3.5  compiler

     earlier than VAX/VMS V4.6.  The  VAX  PASCAL  V3.5  compiler
     will print an informational message warning you of this fact

     will print an informational message warning you of this fact
     when you use any of the  KEY  options.   This  informational

     when you use any of the  KEY  options.   This  informational
     message will be removed in a future release of VAX PASCAL.

     message will be removed in a future release of VAX PASCAL.





                                 1-2





















                    VAX PASCAL V3.5 RELEASE NOTES

                    VAX PASCAL V3.5 RELEASE NOTES


1.2  COMPATIBILITY NOTES

Several corrections in VAX PASCAL V3.5 might affect programs that were
accidentally relying of the incorrect behavior.  Each of these changes
is described below.



1.2.1  Redeclaration Of A Name In A Parameter List

Previous  versions  of  VAX  PASCAL  did  not   detect   the   illegal
redeclaration  of  a  name  inside a parameter list.  The compiler now
produces a warning message indicating that the name has  two  meanings
inside the parameter list.  The compiler still generates the same code
as previous versions, but the warning  message  is  now  generated  as
well.  Examples of illegal redeclarations include:

    PROCEDURE PASS_A_CHAR( CHAR : CHAR ); EXTERNAL;

    PROCEDURE TAKES_2( P1 : CHAR; CHAR : INTEGER ); EXTERNAL;

In each of these declarations, CHAR is used as both a type  identifier
and  as a parameter name.  The Pascal standard does not allow names to
be used in this fashion.



1.2.2  File Location With Partial Filespecs On Qualifiers

The compiler placed output files in the wrong  directory  when  either
the  /OBJECT,  /LISTING,  /ENVIRONMENT,  or /DIAGNOSTICS qualifier was
used on an input file specification and  a  partial  output  file  was
specified.   The compiler placed the output file in the same directory
as the input file instead  of  using  the  current  default  disk  and
directory.

For example, if the following command

    $ SET DEFAULT DISK1:[ABC]
    $ PASCAL DISK2$:[DEF]PROG/OUTPUT=NEWPROG

were given, existing compilers would  create  DISK2$:[DEF]NEWPROG.OBJ.
The correct behavior is to create DISK1$:[ABC]NEWPROG.OBJ.

For more information on the  DCL  syntax  rules  for  qualifiers  that
create  output  files, see the VAX/VMS DCL Concepts Manual (Page 2-10,
Order # AA-HK73A-TE).

To retain the current behavior, you must repeat the disk and directory
specifications on the output file.  For example:

    $ PASCAL DISK2$:[DEF]PROG/OUTPUT=DISK2$:[DEF]NEWPROG


                                 1-3





















                    VAX PASCAL V3.5 RELEASE NOTES

                    VAX PASCAL V3.5 RELEASE NOTES


1.2.3  Default Length And Digits Parameters For DEC And UDEC

The DEC and UDEC builtin routines  incorrectly  computed  the  default
length  and default digits parameter.  The default length parameter is
determined by the compiler at  compile-time  and  the  default  digits
parameter is determined at run-time by the Run-Time Library.

The  VAX  PASCAL  V3.5  compiler  has  been  modified  to  change  the
computation  of  the  default length.  Unless you recompile the source
files, this change won't be seen by existing applications.

The default length of the DEC  and  UDEC  builtin  routines  has  been
changed  from  12  characters  to  11 characters.  This will result in
shorter strings being returned from DEC and  UDEC.   This  change  was
done  so  the  default  output of DEC and UDEC was compatible with the
default output of the WRITE statement.  The output will now  be  a  10
character number preceded by a single blank or a single minus sign.

The VAX/VMS V4.6 PASRTL (VAX PASCAL Run-Time Library) will be modified
to  change the computation of the default digits.  Since the PASRTL is
activated  at  image-activation  time,  this  change  will   be   seen
immediately  by  all programs that default the digits parameter of DEC
and UDEC.

The default digits of the DEC  and  UDEC  builtin  routines  has  been
changed from 8 digits to 10 digits.

Given the following program:

   PROGRAM V35(OUTPUT);
     BEGIN
     WRITELN('<',DEC(1),'>');
     WRITELN('<',DEC(-1),'>');
     END.

The VAX PASCAL V3.4 compiler  under  VAX/VMS  V4.5  will  produce  the
following output:

<    00000001>
<   -00000001>

The VAX PASCAL V3.5  compiler  under  VAX/VMS  V4.6  or  greater  will
produce the following output:

< 0000000001>
<-0000000001>


To retain the current behavior, you must modify your calls to DEC  and
UDEC  and  explicitly  specify a default length of 12 characters and a
default digit count of 8 digits.



                                 1-4





















                    VAX PASCAL V3.5 RELEASE NOTES

                    VAX PASCAL V3.5 RELEASE NOTES


The VAX/VMS V4.6 PASRTL also corrects another  problem  with  DEC  and
UDEC.   The  routines  will  now  truncate  long strings as documented
instead of filling them with asterisks.



1.2.4  VAR READONLY Parameters

In VAX PASCAL, placing the  READONLY  attribute  on  a  VAR  parameter
allows  expresssions  to  be  passed  to  the VAR parameter as well as
variables.  The presence of the READONLY attribute avoids  the  making
of the local-copy in the body of the called routine.

In previous versions of VAX PASCAL, VAR parameters with  the  READONLY
attribute were treated as value parameters.  When passing variables to
VAR READONLY parameters, the generated code fetched the variable, made
a  copy  of  the variable thinking it was an expression and passed the
address of the copy.  No copy should have been made.

The compiler has been modified as follows.  For expressions passed  to
VAR  READONLY  parameters,  treat  the  actual  parameter  as  a value
parameter.  That is, evaluate the expression and pass the  address  of
the  result.   For  variables passed to VAR READONLY parameters, treat
the actual parameter as a VAR parameter.  That is, ensure  the  actual
parameter  is  assignment  compatible to the formal parameter and pass
the address of the  actual  parameter.   In  both  cases,  the  called
routine still does not make a local copy of the parameter.

This change makes a difference when passing  VARYING  strings  to  VAR
READONLY  PACKED  ARRAY  OF CHAR parameters.  In previous versions the
compiler would treat this as a value parameter, make  a  copy  of  the
VARYING,  build  the appropriate descriptor, and call the routine.  In
VAX PASCAL V3.5, the compiler treats this like  a  VAR  parameter  and
signals  an  error  message saying the types are not compatible.  As a
workaround, place  parenthesis  around  the  VARYING  OF  CHAR  actual
parameter.  For example:

   PROCEDURE A( VAR P : [READONLY] PACKED ARRAY [L..U:INTEGER] OF CHAR );
      BEGIN
      END;

   VAR
      V : VARYING [132] OF CHAR;

   BEGIN
   V := 'ABCD';
   A(V);        { Will receive a syntax error message }
   A((V));      { Will not receive any syntax errors  }
   END.





                                 1-5





















                    VAX PASCAL V3.5 RELEASE NOTES

                    VAX PASCAL V3.5 RELEASE NOTES


1.3  UPDATED VAX PASCAL REFERENCE MANUAL AND USER MANUAL

The VAX PASCAL V3.5 kit includes an updated  documentation  set.   The
organization  of  the manuals has changed.  The section in the current
VAX PASCAL Reference Manual that pertains to DCL, EDT, Linking, etc...
has  been moved to the VAX PASCAL User Manual.  The current VAX PASCAL
Language Summary (pocket guide) has been deleted and  the  summary  is
now  an  appendix  in  the  VAX  PASCAL Reference Manual.  Besides the
organization change, both manuals were extensively revised to  correct
any  known  errors,  improve  readability,  and  document  all the new
features added for VAX PASCAL V3.4 and VAX PASCAL V3.5.



1.4  STARLET.PAS INSTALLATION DEPENDENCY

The VAX PASCAL V3.5 kit does not contain a new STARLET.PAS  kit.   The
existing  kit,  PASSTR034,  is  only  provided  to new customers or on
magnetic tape media.  While the STARLET.PAS kit was  not  updated,  we
strongly  suggest that you reinstall PASSTR after each VAX/VMS upgrade
or update.  This is because the STARLET.PAS file that is built by  the
PASSTR034  facility is built from a file of definitions shipped on the
VAX/VMS kit.  This file is SYS$LIBRARY:STARLETSD.TLB.   This  file  is
owned  and  maintained  by  the  VAX/VMS  group  and may be updated by
VAX/VMS releases.  After each VAX/VMS update or upgrade,  reinstalling
STARLET.PAS  allows you to get any corrections or enhancements made to
SYS$LIBRARY:STARLETSD.TLB.



1.5  KNOWN RESTRICTIONS

This section includes all known restrictions in the  VAX  PASCAL  V3.5
compiler.



1.5.1  Blank Padding Of PACKED ARRAY OF CHAR Value Parameters

A  string  parameter  must  be  structurally   compatible   with   its
corresponding  formal  parameter.   The  VAX  PASCAL compiler will not
blank pad a fixed length character string expression  with  blanks  to
match  the  formal  declaration.   Also  VAX PASCAL will not blank pad
default values for such string parameters.  For example, the following
program segment will produce a compile-time error:

   TYPE STR40 = PACKED ARRAY [1..40] OF CHAR;

   PROCEDURE PASS_STR40( P : STR40 );
      BEGIN
      END;



                                 1-6





















                    VAX PASCAL V3.5 RELEASE NOTES

                    VAX PASCAL V3.5 RELEASE NOTES


   BEGIN
   PASS_STR40('Shorter than 40 chars');
   END.




1.5.2  String Expressions As Actual Value Parameters

If several formal value parameters are declared in  the  same  section
and  have  the  same conformant packed array schema, all corresponding
actual parameters must have the same bounds at run-time.  For example:

   PROCEDURE P( A,B : PACKED ARRAY [L..U:INTEGER] OF CHAR );

In a call to P, the actual parameters passed to  A  and  B  must  have
identical  string  bounds.  However, due to an error in the VAX PASCAL
compiler, the bounds of  these  parameters  are  not  checked.   If  a
program  calls  P  with  two  character-string parameters of different
lengths, an error will not be signaled and the bound identifiers L and
U will not correctly describe the bounds of the formal parameter B.

This restriction applies only to string expressions  passed  to  value
conformant  PACKED  ARRAY  OF CHAR parameters.  For all other types of
parameters, bounds checking is done during compile-time.



1.5.3  Passing File Buffer Variables

When the buffer variable of a file is passed as a VAR  parameter,  the
allocation  size  of  the  formal VAR parameter must match that of the
components of the file.  Failure to do so will result in  an  Internal
Compiler Error.  For example:

   PROGRAM A;
   VAR
      F : PACKED FILE OF 0..65535;
      G : FILE OF [WORD] 0..65535;

   PROCEDURE P( VAR I : INTEGER ); EXTERNAL;

   BEGIN
   P(F^); { causes an Internal Compiler Error }
   P(G^); { causes an Internal Compiler Error }
   END.








                                 1-7





















                    VAX PASCAL V3.5 RELEASE NOTES

                    VAX PASCAL V3.5 RELEASE NOTES


1.6  NEW ERROR MESSAGES

This section includes  messages  missing  from  the  VAX  PASCAL  User
Manual.

BANANDORG, Analysis data file 'file' is not on a random access device

     Fatal.  The format of the analysis data file requires random
     file  access.   Please respecify the analysis data file name
     to include a disk device.


BANENVORG, Environment file 'file' is not on a random access device

     Fatal.  The format of VAX PASCAL environment files  requires
     random  file  access.  Please respecify the environment file
     name to include a disk device.





































                                 1-8
































                              CHAPTER 2

                              CHAPTER 2

                  VAX PASCAL V3.5 MAINTENANCE FIXES

                  VAX PASCAL V3.5 MAINTENANCE FIXES




This chapter describes  all  the  changes  made  for  the  VAX  PASCAL
V3.5-196 compiler.



      o  (SPR 11-89962)  The compiler placed output files in the wrong
         directory  when either the /OBJECT, /LISTING, /ENVIRONMENT or
         /DIAGNOSTICS  qualifier   was   used   on   an   input   file
         specification  and  a partial output file was specified.  The
         compiler placed the output file in the same directory as  the
         input  file  instead  of  using  the current default disk and
         directory.

         For example, if the following commands

           $ SET DEFAULT DISK1$:[ABC]
           $ PASCAL DISK2$:[DEF]PROG/OUTPUT=NEWPROG

         were   given,   the   existing    compiler    would    create
         DISK2$:[DEF]NEWPROG.OBJ.   The  correct behavior is to create
         DISK1$:[ABC]NEWPROG.OBJ.  This problem has been fixed.

         For more information on the DCL syntax rules  for  qualifiers
         that  create  output  files,  see VAX/VMS DCL Concepts Manual
         (Page 2-10, Order # AA-HK73A-TE).

         To retain the current behavior, you must repeat the disk  and
         directory specifications on the output file.  For example:

           $ PASCAL DISK2$:[DEF]PROG/OUTPUT=DISK2$:[DEF]NEWPROG



      o  (SPR 11-89790)  Incorrect code was  generated  when  indexing
         into  an  array  of records which contained two DOUBLE fields
         and compiling with /G_FLOATING.  This problem has been fixed.


                                 2-1





















                  VAX PASCAL V3.5 MAINTENANCE FIXES

                  VAX PASCAL V3.5 MAINTENANCE FIXES


      o  (SPR 11-85429A)  An  Internal  Compiler  Error  during   Flow
         Analysis    occasionally    occurred   when   using   similar
         REPEAT..UNTIL statements inside of two or more CASE statement
         elements.  This problem has been fixed.


      o  A VAX RMS error message would occur when opening  a  file  of
         empty records.  This problem has been fixed.


      o  VAX PASCAL missed detection of an illegal redeclaration of an
         identifier  in the parameter list of a procedure or function.
         This problem has been fixed.

         Please  note  that  this  correction  introduces   a   source
         incompatibility  between  previous versions of VAX PASCAL and
         this and subsequent versions of VAX PASCAL.

         Examples of program segments that will now generate a warning
         message are:

            PROCEDURE PASS_A_CHAR( CHAR : CHAR ); EXTERNAL;

            PROCEDURE TAKES_2( PARM : CHAR; CHAR : REAL ); EXTERNAL;



      o  (SPR 11-90651)  Incorrect  code   was   generated   for   the
         FIND_NONMEMBER  builtin which produced incorrect results when
         a  packed  set  of  a  subrange  of  CHAR  was  used  with  a
         character-string  containing  a  character  greater  than the
         upper-bound of the subrange.  This problem has been fixed.


      o  (SPR 11-90678)  Incorrect  code  was  generated  when  inline
         expanding a routine which contained a local variable declared
         with the AT attribute.  This problem has been fixed.


      o  (SPR 11-90896)  Incorrect  code  was  occasionally  generated
         when  passing  variables shorter than a longword by immediate
         value.  This problem has been fixed.


      o  The compiler would not allow assigning of  a  shorter  string
         into  a  conformant packed array of characters.  The compiler
         should have provided blank-padding in  the  same  fashion  as
         assigning  into  packed  array  of character variables.  This
         problem has been fixed.





                                 2-2





















                  VAX PASCAL V3.5 MAINTENANCE FIXES

                  VAX PASCAL V3.5 MAINTENANCE FIXES


      o  The Version 3.4-114 compiler would only print  59  lines  per
         page instead of the previous 60 lines per page.  This problem
         has been fixed.


      o  An Internal Compiler Error during Context  Analysis  occurred
         when  performing set comparisons on sets larger than 16 bits,
         but less than 32 bits when one of the operands was a literal.
         This problem has been fixed.


      o  (SPR 11-91277)  An  Internal  Compiler   Error   occasionally
         occurred   during  Context  Analysis  when  compiling  nested
         REPEAT..UNTILs and compiling with  /OPTIMIZE.   This  problem
         has been fixed.


      o  An Internal Compiler Error occurred during  Context  Analysis
         when compiling the following:

             TYPE
                 EMPTYREC = RECORD END;
                 INPUTREC = RECORD INP : EMPTYREC; END;
                 TRANSFER = RECORD MODEL : EMPTYREC;
                                   OPT   : DOUBLE; END;

             VAR
                 OTHERDATA : INPUTREC;
                 INPUTDATA : TRANSFER;

             BEGIN
             INPUTDATA.MODEL := OTHERDATA.INP;
             END;

         This problem has been fixed.


      o  Occasionally incorrect  code  was  generated  when  compiling
         nested WHILE or REPEAT statements with optimizations enabled.
         For example:

             WHILE P <> 0 DO
                 BEGIN
                 W := P MOD 2;
                 WHILE FOO[J] = BAR[W,K] DO
                     BEGIN
                     K := K + 1;
                     J := J + 1;
                     END;
                 END;
             W := TEMP MOD 2;
             FOR J := 1 TO L DO


                                 2-3





















                  VAX PASCAL V3.5 MAINTENANCE FIXES

                  VAX PASCAL V3.5 MAINTENANCE FIXES


                 BAR[W,K+J-1] := FOO[J];
             END;

         The compiler did  not  correctly  realize  that  W  had  been
         modified between the uses in the WHILE statements and the use
         in the FOR statement.  This problem has been fixed.


      o  An Internal Compiler Error during  Source  Analysis  occurred
         when   the   array   subscript  of  an  array  element  being
         initialized in the VALUE section was an undeclared  constant.
         This problem has been fixed.


      o  The default length of the DEC and UDEC builtin  routines  has
         been  changed from 12 characters to 11 characters.  This will
         result in shorter strings being returned from DEC  and  UDEC.
         The change was done so the default output of DEC and UDEC was
         a 10 character number preceded by a single blank or a  single
         minus  sign.  If you want the prior behavior, you must modify
         your calls to DEC and UDEC to explicitly specify  the  length
         parameter.     Since   this   parameter   is   defaulted   at
         compile-time,  you  must  recompile  to  see  this   behavior
         difference.

         In VAX/VMS V4.6, the Run-Time Library has  been  modified  to
         change  the  default  number  of minimum digits from 8 to 10.
         This makes DEC and UDEC consistent with WRITE by allowing  10
         characters  for  an INTEGER expression.  Since this parameter
         is defaulted at execution-time, the change will  take  effect
         immediately.


      o  An Internal Compiler Error during  Source  Analysis  occurred
         when  a  %SUBTITLE directive with more than 31 characters was
         immediately preceded by a formfeed.  This  problem  has  been
         fixed.


      o  (SPR 11-88312)  The compiler sometimes generated an incorrect
         branch  when  comparing  a  variable against minus one.  This
         problem has been fixed.


      o  An Internal Compiler Error during Tree Construction  occurred
         when  a  large program used routine parameters.  This problem
         has been fixed.


      o  Code was not generated for nested procedures with the  GLOBAL
         attribute unless they were called from within the compilation
         unit.  This problem has been fixed.


                                 2-4





















                  VAX PASCAL V3.5 MAINTENANCE FIXES

                  VAX PASCAL V3.5 MAINTENANCE FIXES


      o  An   Internal   Compiler   Error   during   Source   Analysis
         occasionally  occurred  when  an  invalid  program  specified
         %INCLUDE files which were missing.   This  problem  has  been
         fixed.


      o  Incorrect code was occasionally generated when assigning into
         VARYING  OF  CHAR  variables and compiling with optimizations
         enabled.  For example:

             PROGRAM TEST ( OUTPUT ) ;
          
             VAR
                 FIRSTSTR :  PACKED ARRAY [1..30] OF CHAR;
                 TEMP : VARYING [20] OF CHAR; 
                 INDEX : INTEGER;
             BEGIN
             TEMP := 'first';
             FOR INDEX := 1 TO TEMP.LENGTH DO
                FIRSTSTR[INDEX] := TEMP[INDEX];
             TEMP := 'last';
             FOR INDEX := 1 TO TEMP.LENGTH DO
                WRITE( TEMP[INDEX] );


         This problem has been fixed.


      o  (SPRs 11-90744 and 11-91672)  Incorrect  sign  extension  and
         subrange  checking  was  occasionally  preformed when reading
         into a variable that was an unsigned  sub-range  of  INTEGER.
         This problem has been fixed.


      o  An   Internal   Compiler   Error   during   Source   Analysis
         occasionally   occurred   when  an  invalid  GOTO  label  was
         specified, and  that  symbol  was  referenced  later  in  the
         program.  This problem has been fixed.


      o  An   Internal   Compiler   Error   during   Source   Analysis
         occasionally  occurred when a %DICTIONARY directive specified
         a CDD record from a subdictionary that was deleted  from  the
         CDD.  This problem has been fixed.


      o  (SPR 11-88179)  An Internal  Compiler  Error  during  Context
         Analysis  occasionally  occurred when indexing into an array.
         The compiler was unable to determine if the address would  be
         byte-aligned.  This problem has been fixed.




                                 2-5





















                  VAX PASCAL V3.5 MAINTENANCE FIXES

                  VAX PASCAL V3.5 MAINTENANCE FIXES


      o  (SPR 11-92786)  The compiler occasionally generated incorrect
         machine code when the optimize switch was used.  The compiler
         tried to remove a compiler-generated label that  had  already
         been referenced.  An access violation would occur at run time
         when the  code  referenced  this  non-existent  label.   This
         problem has been fixed.


      o  A compile-time  error  was  generated  by  mistake  when  the
         function  result  type  name  had  been redeclared within the
         formal parameter list as in the following example.

                 TYPE
                      T = 0..10;
                 FUNCTION ABC( T : CHAR ) : T;

         This is  legal  Pascal,  and  should  not  produce  an  error
         message.  This problem has been fixed.


      o  (SPR 11-92440)  The compiler occasionally generated incorrect
         code  for  the  following  program segment and compiling with
         optimizations enabled.

             J := 0;
             REPEAT
                 J := J + 1;
                 IF LONG_TEXT[J] = 'Z' 
                 THEN
                     LONG_TEXT[J] := 'A'
             UNTIL LONG_TEXT[J] <> 'A';

         The compiler incorrectly thought the  first  range  check  of
         LONG_TEXT[J]  could be moved outside of the REPEAT loop using
         J := 0.  The compiler did not correctly flag that  the  value
         of J changed prior to the first use of the range check.  As a
         result an unexpected runtime error occurs  if  LONG_TEXT  did
         not  have  a  0 element.  This problem has been fixed and the
         correct code is generated.


      o  When passing a variable to a VAR  READONLY  formal  parameter
         the  compiler  unnecessarily  generates  a  local copy of the
         actual and then passes the address of this copy to the called
         routine.   That  is  even though the formal was declared with
         the VAR  keyword  the  actual  is  still  passed  with  value
         semantics.   This  problem  has been corrected.  The compiler
         will now pass the actual using variable semantics.






                                 2-6





















                  VAX PASCAL V3.5 MAINTENANCE FIXES

                  VAX PASCAL V3.5 MAINTENANCE FIXES


      o  A compile-time error was generated by mistake  at  a  routine
         call  when  the actual parameter being passed was an existing
         VAR formal parameter declared with  the  TRUNCATE  attribute.
         This problem has been fixed.


      o  An Internal Compiler Error  during  Tree  Construction  would
         occasionally   occur   when  passing  the  BODY  field  of  a
         conformant VARYING string to  a  routine  with  a  conformant
         array parameter as in the following example:

           TYPE
             RNG = 1..255;

           PROCEDURE A(CNF : PACKED ARRAY[L..U:RNG] OF CHAR);
             BEGIN
             END;

           PROCEDURE B(VRY_STR : VARYING [NAME_LENGTH] OF CHAR);
             BEGIN
             A( VRY_STRING.BODY );
             END;

         This problem has been fixed.


      o  The  compiler   would   occasionally   generate   bad   DEBUG
         information resulting in the SET BREAK command establishing a
         breakpoint at an invalid  address.   This  problem  has  been
         fixed.


      o  The compiler would occasionally generate incorrect code  when
         a  looping structure such as a REPEAT or a WHILE contained an
         IF  statement  nested  inside  another  IF  statement.   This
         problem has been fixed.


      o  (SPR 11-89904)  The compiler occasionally generated incorrect
         code  when  calling a routine whose actual parameters require
         stack temporaries.  This problem has been fixed.


      o  (SPR 11-92910)  An  Internal  Compiler   Error   occasionally
         occurred  with  optimizations  enabled during Profit Analysis
         when a for loop header contained a typecast operation.   This
         problem has been fixed.


      o  The builtin function NEXT occasionally calculated  the  wrong
         value  for a record type containing a field which is aligned.
         This problem  has  been  fixed  and  the  compiler  will  now


                                 2-7





















                  VAX PASCAL V3.5 MAINTENANCE FIXES

                  VAX PASCAL V3.5 MAINTENANCE FIXES


         generate the correct result.


      o  An Internal Compiler Error occasionally occurs during Context
         Analysis  when  compiling  something  like  the following and
         compiling with optimizations enabled.

             REPEAT  
               I := I + 1
             UNTIL ARR[I] <> ' ';
             
             REPEAT  
               I := I + 1;
               REPEAT  
                 I := I + 1
               UNTIL (ARR[I] <> ' ')
             UNTIL (I > 20);

         This problem has been corrected.


      o  An Internal Compiler Error occasionally occurred during  Tree
         Construction  when  passing  the  BODY  field of a conformant
         VARYING string to  an  UNSAFE  conformant  array  as  in  the
         following example.

            PROCEDURE A( 
                 VAR P : [UNSAFE] PACKED ARRAY [L..U:INTEGER] OF CHAR);
              BEGIN
              END;

            PROCEDURE B( 
                 VAR P : VARYING [LEN] OF CHAR);
              BEGIN
              A(P.BODY);
              END;

         This problem has been corrected.


      o  (SPR 11-93710)  An  Internal  Compiler   Error   occasionally
         occurred during Source Analysis when a program contained over
         150 WITH statements.  This problem has been corrected.


      o  Incorrect  code  was  generated  for  the  following  program
         section:

           IF KEYWORD = 'OF      ' THEN
             REPEAT
               IF TOKEN = 10 THEN
                 BEGIN


                                 2-8





















                  VAX PASCAL V3.5 MAINTENANCE FIXES

                  VAX PASCAL V3.5 MAINTENANCE FIXES


                 KEYWORD := 'ESAC    ';
                 IF KEYWORD <> 'ESAC' THEN;
                 END
               UNTIL KEYWORD = 'ESAC    '

         The compiler did not correctly flag that the value of Keyword
         changed  within  the  IF  statement.   This  problem has been
         corrected.


      o  (SPR 11-90521)  The   compiler   would   sometimes   generate
         incorrect code for the last reference of a parameter declared
         with the [TRUNCATE] attribute.  This problem has been fixed.


      o  (SPR 11-93834)  When optimizations are  enabled  an  Internal
         Compiler  Error would sometimes occur when trying to optimize
         a common character subexpression which was to be assigned  to
         a fixed length string as in the following example:

            STR : PACKED ARRAY [1..80] OF CHAR;
            I   : INTEGER := 50;

            BEGIN
                STR := CHR( I );
                STR := CHR( I );
            END;

         This problem has been fixed.


      o  The  compiler  occasionally  generated  incorrect  code  when
         dereferencing  a  pointer that was declared with the VOLATILE
         attribute inside a looping construct or  an  IF  or  a  CASE.
         This problem has been fixed.


      o  When  compiling  with  /OPTIMIZE  and   /CHECK=NOBOUNDS   the
         compiler  would  sometimes over-optimize a looping construct.
         This occurred  with  loops  containing  references  to  array
         elements  when  the variable used as a subscript was modified
         at the end of the loop.  For example:

                 REPEAT
                     FOO := ARR[R];
                     ...
                     ...
                     R := EXPR;
                 UNTIL ARR[R] = 0;

         This problem has been fixed.



                                 2-9





















                  VAX PASCAL V3.5 MAINTENANCE FIXES

                  VAX PASCAL V3.5 MAINTENANCE FIXES


      o  (SPR 11-94398)  The compiler occasionally generated incorrect
         warning  messages  when  passing  a  variable  to  a  foreign
         mechanism   routine   parameter   with   /USAGE=UNINITIALIZED
         enabled.  This problem has been fixed.


      o  (SPR 11-94365)  The PAD function  would  not  accept  a  fill
         character  of  CHR(0)  when used in a context that required a
         compile-time  constant  expression,  such  as  in   a   CONST
         declaration.  This problem has been fixed.


      o  (SPR 11-94687)  An  Internal  Compiler  Error  during  Profit
         Analysis   occurred  when  the  compiler  attempted  to  move
         loop-invariant code in the boolean  expression  of  an  empty
         looping construct to an outer level.  For example:

                 WHILE NOT BOOL DO
                    BEGIN
                    BOOL := BOOL1 OR BOOL2
                    END;
                    WHILE NOT BOOL DO
                    (* *)
                    END;

         This problem has been fixed.


      o  (SPR 11-94322)  The compiler occasionally over-optimized  use
         of global variables.  Changes made to a global variable by an
         external routine called from a non-inlined routine would  not
         be seen at the main program level.  For example:

           [ENVIRONMENT('A')]
           PROGRAM A (output);

           VAR GLOBAL_VAR : INTEGER;

           PROCEDURE EXTERN_ROUTINE; EXTERNAL;
           { PROCEDURE CHANGES GLOBAL_VAR }

           [OPTIMIZE(NOINLINE)]
           PROCEDURE CALL_EXTERN;
             BEGIN
             EXTERN_ROUTINE;
             WRITELN('Correct ',GLOBAL_VAR);
             END;

           BEGIN
           GLOBAL_VAR := 1;
           CALL_EXTERN;
           WRITELN('Incorrect ',GLOBAL_VAR);


                                 2-10





















                  VAX PASCAL V3.5 MAINTENANCE FIXES

                  VAX PASCAL V3.5 MAINTENANCE FIXES


           END;

         This problem has been corrected.


      o  (SPR 11-94322)  The compiler issued an UNINITIALIZED  warning
         message  on a global variable that had been initialized in an
         external routine.  This has been corrected, the compiler  now
         assumes that an inheritable variable may be initialized by an
         external routine.


      o  (SPR 11-94687)  The Compiler would occasionally  go  into  an
         infinite   loop  during  Flow  Analysis  when  attempting  to
         optimize common subexpressions from the ELSE portion within a
         nested IF statement.  This problem has been fixed.


      o  (SPRs 11-95027, 11-95028)  An Internal Compiler Error occured
         or  incorrect code was generated for SET comparisons when the
         left operand was a SET between 9 and 32 bits  in  length  and
         the  right  operand  was  a  SET  larger  than 32 bits.  This
         problem has been fixed.


      o  (SPR 11-94868)  An Internal Compiler Error sometimes  occured
         when a default value of [] (the empty set) was supplied for a
         procedure parameter and the procedure was  expanded  in-line.
         This problem has been fixed.


      o  (SPR 11-95035)  An Internal Compiler Error sometimes  occured
         with  /OPTIMIZE  when  looping constructs where nested and an
         inner  construct  contained  a  null  statement  list.    For
         example:

             WHILE k < (N DIV 2) DO ;

         This problem has been fixed.


      o  (SPR 11-94869)  Incorrect code was occasionally generated for
         the  FIND_MEMBER  and FIND_NONMEMBER builtins when the second
         parameter was an expression.  This problem has been fixed.


      o  (SPR 11-95705)  Incorrect  code  was  occasionally  generated
         when the CARD builtin function was evaluated at compile-time.
         For  example,  when  its  parameter  was  a  constant  or   a
         compile-time expression.  This problem has been fixed.




                                 2-11





